"""
类本身也是对象，既 Class 对象

@staticmethod 装饰器 将方法标记为静态方法
静态方法不会接收隐式参数 self，语法

class C:
    @staticmethod
    def f():
        pass

静态方法既可以由类调用，也可以由实例中调用

1、@classmethod:
    自动传入类作为第一个参数 (cls)
    可以访问/修改类属性和方法
    可以用于创建工厂方法
    支持继承
2. @staticmethod:
    不自动传入任何参数
    不能直接访问类属性和方法
    适合与类相关但不需要访问类属性的功能
    本质上就是普通函数
"""

class Monster:

    name = "蝎子精"
    age = 300

    def hi(self):
        print(f"hi() {self.name} {self.age}")

    @staticmethod
    def ok():
        print("ok()")

print(Monster)
# 通过 Class 对象，可以引用属性（没有创建实例对象也可以引用/访问）
print(f"Monster.name：{Monster.name}")
print(f"Monster.age：{Monster.age}")

# 通过类名如何调用非静态成员方法
Monster.hi(Monster)

print("*" * 50)

# 通过实例对象，可以引用属性
m1 = Monster()
m1.ok()
Monster.ok()